'''
Description: 
Author: Zilu
Date: 2021-11-04 14:31:43
Version: 
LastEditTime: 2021-11-04 15:06:50
LastEditors: Zilu
'''

# 将列表生成式中的[]换成()就可以创建一个生成器对象，其不保存值，保存的是算法
g = (x*x for x in range(1,11))
type(g)

# 使用next可以获得生成器的下一个元素
next(g)

# generator也是可迭代对象，基本上不会用next，而是使用for
g = (x*x for x in range(1,11))
for n in g:
    print(n)

# generator一次使用

# generator函数
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

f = fib(6)
type(f)

# 使用yield关键字的函数，generator函数遇到next()时执行，遇到yield时返回
# 再次执行时从上次yield出继续执行
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield (3)
    print('step 3')
    yield (5)

o = odd()
next(o)
next(o)
next(o)
next(o)

for n in f:
    print(n)

# 使用捕获错误语句才能获得generator函数中得到return的值
g = fib(6)
while True:
    try:
        x = next(g)
        print('x:',x)
    except StopIteration as e:
        print('Generator return value:',e.value)
        break

# 练习：杨辉三角，把每一行看做一个list，试写一个generator，不断输出下一行的list
def triangle():
    L = [1]
    while True:
        yield L
        L = [1 if n==0 or n==len(L) else L[n-1] + L[n] for n in range(len(L)+1)]
